package com.wu.yygh.common.result;

/**
 * @ClassName Result
 * @Author 浮生光
 * @Date 2022/6/29 0:21
 * @Description Result
 * @Version 1.0
 */
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 全局返回统一结果类
 */
@Data
@NoArgsConstructor
@ApiModel("全局统一返回结果") // 该注解用于描述返回对象的意义
public class Result<T> {
    // 统一返回json的话：code message data

    @ApiModelProperty("返回码") // 描述对象属性注解
    private Integer code;

    @ApiModelProperty("返回消息")
    private String message;

    @ApiModelProperty("返回数据")
    private T data;

    /**
     * 这俩方法有点鸡肋吧，不知道有啥用
     * @param msg
     * @return
     */
    public Result<T> message(String msg){
        this.setMessage(msg);
        return this;
    }

    public Result<T> code(Integer code){
        this.setCode(code);
        return this;
    }

    /**
     * 三个创建返回对象的方法
     * @param data
     * @param <T>
     * @return
     */
    public static <T> Result<T> build(T data) {
        Result<T> result = new Result<>();
        if (data != null){ // TODO 为什么要判断，如果是null 不能设置吗？
            result.setData(data);
        }
        return result;
    }

    public static <T> Result<T> build(ResultCodeEnum resultCodeEnum) {
        return build(null, resultCodeEnum);
    }

    public static <T> Result<T> build(T data, ResultCodeEnum resultCodeEnum) {
        Result<T> result = build(data);
        result.setCode(resultCodeEnum.getCode());
        result.setMessage(resultCodeEnum.getMessage());
        return result;
    }

    /**
     * 操作成功的两个方法，可以传参也可以不传
     * @param <T>
     * @return
     */
    public static <T> Result<T> ok(){
        return ok(null);
    }

    public static <T> Result<T> ok(T data){
        return build(data, ResultCodeEnum.SUCCESS);
    }

    /**
     * 操作失败的两个方法，有参无参都可以
     * @param <T>
     * @return
     */
    public static <T> Result<T> fail(){
        return fail(null);
    }

    public static <T> Result<T> fail(T data) {
        return build(data, ResultCodeEnum.FAIL);
    }

    /**
     * 判断返回的状态对象是否是成功的
     * @return
     */
    public boolean isOk() {
        if (ResultCodeEnum.SUCCESS.getCode().equals(this.getCode())){
            return true;
        }
        return false;
    }

}
